package cn.mg.mybatis.service;


import cn.mg.mybatis.domain.BaseQuery;
import cn.mg.mybatis.domain.PageResult;
import cn.mg.framework.exception.DataAccessException;

import java.io.Serializable;
import java.util.List;

/**
 * @author 何兆明
 * @description
 * @create 2018/8/1 下午6:32
 */
public interface BaseService<T extends Serializable> {

    /**
     * 新建对象
     *
     * @param t 对象
     * @return z主键id
     * @throws
     */
    void insert(T t) throws DataAccessException;

    /**
     * 新建对象或更新对象
     *
     * @param t
     * @return
     */
    void insertOrUpdate(T t) throws DataAccessException;

    /**
     * 更新对象
     *
     * @param t 对象
     * @return
     * @throws
     */
    int update(T t) throws DataAccessException;

    /**
     * ID查找对象
     *
     * @param id 对象ID
     * @return
     * @throws
     */
    T getById(Long id) throws DataAccessException;

    /**
     * ID查找对象，会行锁
     *
     * @param id 对象ID
     * @return
     * @throws
     */
    T getByIdForUpdate(Long id) throws DataAccessException;

    /**
     * 按条件查找
     *
     * @param query
     * @return
     */
    List<T> query(BaseQuery<T> query) throws DataAccessException;

    /**
     * 根据sql mapping中定义的sql名称，以及传入的参数来查找单个实体
     *
     * @param query 参数
     * @return
     */
    T queryOne(BaseQuery<T> query) throws DataAccessException;

    /**
     * 分页查找
     *
     * @param query
     * @return
     * @throws DataAccessException
     */
    PageResult<T> query4Page(BaseQuery<T> query) throws DataAccessException;

    /**
     * ID删除对象
     *
     * @param id
     * @return
     * @throws
     */
    int deleteById(Long id) throws DataAccessException;

    /**
     * 删除对象
     *
     * @param query
     * @return
     * @throws
     */
    int delete(BaseQuery<T> query) throws DataAccessException;

    /**
     * 按条件计数
     *
     * @param query
     * @return
     * @throws DataAccessException
     */
    long count(BaseQuery<T> query) throws DataAccessException;

}
